package com.chuidiang.ejemplos.hibernate_annotations;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.hibernate.Session;

/**
 * Ejemplo sencillo de hibernate usando annotations.<br>
 * Se crea una instancia de Fligth, se guarda en base de datos, se consulta y
 * muestra por pantalla, se modifica y se vuelve a consultar y mostrar por
 * pantalla.
 * 
 * @author Chuidiang
 * 
 */
public class Ejemplo1 {

	public static void main(String[] args) {
		BasicConfigurator.configure();
		Logger.getRootLogger().setLevel(Level.INFO);
		new Ejemplo1();
	}

	public Ejemplo1() {
		// Se inserta
		// Long id = insertFlight("Bilbao");

		// Se consulta y muestra por pantalla
		// listFlights();

		// Se modifica
		// updateFlight(id);

		// Se vuelve a consultar y mostrar por pantalla
		// listFlights();

		Long idAlumno = insertAlumno();

		listAlumnos();
		listFlights();
	}

	private void updateFlight(Long id) {
		Session s = HibernateUtil.getSession();
		s.beginTransaction();

		Flight vuelo = (Flight) s.load(Flight.class, id);
		vuelo.setFirstname("Nombre cambiado");

		s.getTransaction().commit();
	}

	private void listFlights() {
		Session s = HibernateUtil.getSession();
		s.beginTransaction();

		List<Flight> vuelos = s.createQuery("from Flight").list();
		for (Flight vuelo : vuelos)
			System.out.println(vuelo.toString());

		s.getTransaction().commit();
	}

	private Flight getFlightById(Long id) {
		Session s = HibernateUtil.getSession();
		Flight f = null;

		s.beginTransaction();

		Set<Flight> vuelos = (Set<Flight>) s.createQuery("from Flight").list();
		for (Flight vuelo : vuelos)
			System.out.println(vuelo.toString());

		s.getTransaction().commit();

		return f;
	}

	private Long insertFlight(String nombre) {
		// Se obtiene la sesion
		Session s = HibernateUtil.getSession();
		s.beginTransaction();

		// Se instancia la clase Flight y se rellenan sus datos
		Flight f = new Flight();
		f.setFirstname(nombre);

		f.setFecha(new Date());

		// Se salva en base de datos
		s.save(f);
		s.getTransaction().commit();

		return f.getId();
	}

	private Long insertAlumno() {
		// Se obtiene la sesion
		Session s = HibernateUtil.getSession();
		s.beginTransaction();

		// Se instancia la clase Alumno y se rellenan sus datos
		Alumno a = new Alumno();
		a.setNombre("Peio");

		Set<Flight> flights = new HashSet<Flight>();

		Flight f1 = new Flight();
		f1.setFirstname("Jamaica");
		Flight f2 = new Flight();
		f2.setFirstname("Mexico");

		flights.add(f1);
		flights.add(f2);
		a.setFligths(flights);
		// Se salva en base de datos
		s.save(a);

		s.getTransaction().commit();

		return a.getId();
	}

	private void listAlumnos() {
		Session s = HibernateUtil.getSession();
		s.beginTransaction();

		List<Alumno> alumnos = s.createQuery("from Alumno").list();
		for (Alumno a : alumnos)
			System.out.println(a.toString());

		s.getTransaction().commit();
	}

	private void updateAlumno(Long id) {
		Session s = HibernateUtil.getSession();
		s.beginTransaction();

		Alumno alumno = (Alumno) s.load(Alumno.class, id);
		alumno.setNombre("nombre cambiado");

		s.getTransaction().commit();
	}

}
